request 您所在的位置:网站首页 中断线程化 缺点 request

request

2023-08-28 17:51| 来源: 网络整理| 查看: 265

经典博文 文章链接备注linux中断申请之request_threaded_irqhttps://www.cnblogs.com/dirt2/p/5632061.html明确两种方式的优缺点linux驱动request_threaded_irq()https://blog.csdn.net/gx19862005/article/details/18740705中断原理清晰 实践总结

在wiegand驱动开发过程中,自测试时,一边发送一边接受,那么在发送两个信号间的时间,需要处理完一个中断,否则会出现中断丢失。如果是从wiegand设备接受信号,同样的要求。按照wiegand协议,两个信号间时间是很短的,在开发中刚开始使用request_irq处理中断,系统占用资源稍高,就会出现中断丢失,替换为request_threaded_irq,很好的解决了时效问题。

总结: request_threaded_irq:中断处理线程化,很好解决高频率的中断响应,类似异步处理 request_irq:类似于同步处理事务,适合非高频率中断响应。

Demo irqreturn_t irq_thread_handler(int irq, void *dev_id) { st_itech_led_dev* dev = (st_itech_led_dev*)dev_id; print_dbg("irq = %d, dev->crtl_irq: %d", irq, dev->crtl_irq); if(irq != dev->crtl_irq) { return IRQ_NONE; } dev->occur_irq = true; udelay(500); dev->irq_result = gpio_get_value(dev->ctrl_gpio); print_dbg("gpio_level: %d", gpio_get_value(dev->ctrl_gpio)); print_dbg("irq_result: %d", dev->irq_result); wake_up_interruptible(&led_irq_in_waitq); return IRQ_HANDLED; } irqreturn_t sensor_irq_handler(int irq, void *dev_id) { return IRQ_WAKE_THREAD; } static void init_light_sensor_irq(st_itech_led_dev* dev) { int ret = -1; int irq_tmp = gpio_to_irq(dev->ctrl_gpio); if (ENXIO == irq_tmp) { print_err("get irq num failed.\n"); return; } dev->crtl_irq = irq_tmp; print_info("request led(%d) sensor irq(%d)", dev->param.num, irq_tmp); ret = request_threaded_irq(irq_tmp, sensor_irq_handler, irq_thread_handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "light_sensor_irq_up", dev); if (ret) { print_err("request_threaded_irq irq_rising_handler ERROR!!!\n"); return ; } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有